package com.example.demo.zaqizabatest.leetcode.day4;

/**
 * 找出数组中重复的数字。
 *
 * 一个长度为n-1的递增排序数组中的所有数字都是唯一的，并且每个数字都在范围0～n-1之内。
 * 在范围0～n-1内的n个数字中有且只有一个数字不在该数组中，请找出这个数字。
 *
 * 输入: [0,1,3]
 * 输出: 2
 *
 * 输入: [0,1,2,3,4,5,6,7,9]
 * 输出: 8
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Solution3 {
    public static int missingNumber(int[] nums) {
        boolean b = nums[0] != 0 || (nums.length == 1 && nums[0] == 1);
        if (b) {
            return 0;
        }
        if (nums.length == 1 && nums[0] == 0) {
            return 1;
        }
        int low = 0;
        int high = nums.length - 1;

        return search(low, high, nums);

    }

    /**
     *  0 1 2 3 4 5 6 8
     *  0 2 3 4 5 6 7 8 9 10
     * @param low
     * @param high
     * @param nums
     * @return
     */
    public static int search(int low, int high, int[] nums){
        int mid = (high + low)/2;
        int lowNum = nums[mid] - nums[low] + 1;
        int lowNumber = mid - low + 1;
        int highNum = nums[high] - nums[mid +1] + 1;
        int highNumber = high - (mid +1) + 1;
        if ((nums[high] - nums[low] +1) == 2) {
            return nums[high] + 1;
        }
        if ((nums[mid +1] - nums[mid]) > 1) {
            return nums[mid] + 1;
        }
        if (lowNum > lowNumber) {
            return search(low, mid, nums);
        } else if (highNum > highNumber) {
            return search(mid+1, high, nums);
        } else {
            return nums.length;
        }
    }

    public static void main(String[] args) {
        int[] nums = new int[]{0,1};
        System.out.println(missingNumber(nums));
    }







}
